{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow.compat.v1 as tf\n",
    "tf.disable_v2_behavior()\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "尝试对源代码进行改进，以提高验证集validation准确率。但经过多次尝试，调整神经元个数，增加隐层和调整学习率均没有太大效果，特别是隐层数量的增加好像还降低了准确率；调整神经元个数也没有什么效果。学习率增加和降低最后都发现没有0.3合适。最后通过增大训练次数，增加到3000，提高了准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量， 所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [],
   "source": [
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 3000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.743892, the validation accuracy is 0.8642\n",
      "after 200 training steps, the loss is 0.420122, the validation accuracy is 0.897\n",
      "after 300 training steps, the loss is 0.131518, the validation accuracy is 0.9096\n",
      "after 400 training steps, the loss is 0.158574, the validation accuracy is 0.9326\n",
      "after 500 training steps, the loss is 0.417889, the validation accuracy is 0.9368\n",
      "after 600 training steps, the loss is 0.0860775, the validation accuracy is 0.9404\n",
      "after 700 training steps, the loss is 0.0890855, the validation accuracy is 0.9502\n",
      "after 800 training steps, the loss is 0.279235, the validation accuracy is 0.9452\n",
      "after 900 training steps, the loss is 0.135816, the validation accuracy is 0.9554\n",
      "after 1000 training steps, the loss is 0.0907267, the validation accuracy is 0.9518\n",
      "after 1100 training steps, the loss is 0.212505, the validation accuracy is 0.958\n",
      "after 1200 training steps, the loss is 0.045839, the validation accuracy is 0.9534\n",
      "after 1300 training steps, the loss is 0.154308, the validation accuracy is 0.9558\n",
      "after 1400 training steps, the loss is 0.217529, the validation accuracy is 0.9608\n",
      "after 1500 training steps, the loss is 0.146846, the validation accuracy is 0.9592\n",
      "after 1600 training steps, the loss is 0.14094, the validation accuracy is 0.9624\n",
      "after 1700 training steps, the loss is 0.195881, the validation accuracy is 0.9664\n",
      "after 1800 training steps, the loss is 0.0765582, the validation accuracy is 0.964\n",
      "after 1900 training steps, the loss is 0.0397286, the validation accuracy is 0.9628\n",
      "after 2000 training steps, the loss is 0.126216, the validation accuracy is 0.9606\n",
      "after 2100 training steps, the loss is 0.110462, the validation accuracy is 0.9602\n",
      "after 2200 training steps, the loss is 0.0392099, the validation accuracy is 0.9652\n",
      "after 2300 training steps, the loss is 0.051557, the validation accuracy is 0.9694\n",
      "after 2400 training steps, the loss is 0.0860418, the validation accuracy is 0.9664\n",
      "after 2500 training steps, the loss is 0.0681537, the validation accuracy is 0.969\n",
      "after 2600 training steps, the loss is 0.0623948, the validation accuracy is 0.9688\n",
      "after 2700 training steps, the loss is 0.0165096, the validation accuracy is 0.9702\n",
      "after 2800 training steps, the loss is 0.141578, the validation accuracy is 0.9716\n",
      "after 2900 training steps, the loss is 0.186282, the validation accuracy is 0.9672\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9659\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-2900\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "可见，增加了训练次数以后，总体准确率提高不少。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
